5.12. Работа с БД
Работа с БД
GORM (Grails ORM) - ORM, используемый во фреймворке Grails. Прост в использовании, интегрирован с Spring, применяется в веб-приложениях на Grails.
GORM — это реализация паттерна Active Record для Groovy, позволяющая легко работать с базами данных. Он скрывает сложность SQL и Hibernate под простым и интуитивно понятным API.
GORM построен на основе Hibernate Core, поддерживает реляционные БД (PostgreSQL, MySQL, H2 и др.), интегрирован с Spring Boot. Работает как в Grails, так и автономно в standalone-приложениях.
Как работать с GORM?
- Создание доменных классов (Domain Classes)
class Book {
String title
String author
BigDecimal price
Date releaseDate
static constraints = {
title blank: false, maxSize: 100
author nullable: true
}
}
Каждый такой класс автоматически становится таблицей в БД (book), а поля — столбцами.
- Основные операции CRUD
Создание:
def book = new Book(title: "Groovy in Action", author: "Dierk König", price: 49.99)
book.save()
Чтение:
def book = Book.get(1) // По ID
def books = Book.findAllByAuthor("Dierk König")
Обновление:
def book = Book.get(1)
book.price = 39.99
book.save()
Удаление:
def book = Book.get(1)
book.delete()
- Динамические методы поиска
GORM предоставляет множество удобных методов:
Book.findByTitle("Groovy in Action")
Book.findAllByPriceLessThan(50.0)
Book.countByAuthor("Dierk König")
Book.findAllByReleaseDateBetween(startDate, endDate)
- Связи между доменами
Пример связи один ко многим:
class Author {
String name
static hasMany = [books: Book]
}
class Book {
String title
static belongsTo = [author: Author]
}
Теперь можно делать:
def author = new Author(name: "Dierk König").save()
def book = new Book(title: "Groovy in Action").save()
author.addToBooks(book).save()
// Получить все книги автора
author.books.each { println it.title }
Можно явно указать, как будет выглядеть таблица в БД:
class Book {
String title
static mapping = {
table 'books'
title column: 'book_title', length: 255
}
}
Работа с транзакциями
Book.withTransaction { status ->
def book = new Book(title: "New Book")
if (book.save()) {
// ...
} else {
status.setRollbackOnly()
}
}
GORM можно использовать и без Grails, например, в Spring Boot приложениях.
Для этого нужно добавить зависимость в build.gradle и использовать доменные классы и сервисы в контроллерах или сервисах Spring.